package org.dromara.common.websocket.holder

import org.springframework.web.socket.CloseStatus
import org.springframework.web.socket.WebSocketSession
import java.util.concurrent.ConcurrentHashMap

/**
 * WebSocketSession 用于保存当前所有在线的会话信息
 * @author LikeYouDo
 * @date 2025/09/22
 */
object WebSocketSessionHolder {
    private val USER_SESSION_MAP: MutableMap<Long, WebSocketSession> = ConcurrentHashMap<Long, WebSocketSession>()

    /**
     * 将WebSocket会话添加到用户会话Map中
     *
     * @param sessionKey 会话键，用于检索会话
     * @param session    要添加的WebSocket会话
     */
    @JvmStatic
    fun addSession(sessionKey: Long, session: WebSocketSession) {
        removeSession(sessionKey)
        USER_SESSION_MAP[sessionKey] = session
    }

    /**
     * 从用户会话Map中移除指定会话键对应的WebSocket会话
     *
     * @param sessionKey 要移除的会话键
     */
    @JvmStatic
    fun removeSession(sessionKey: Long) {
        val session: WebSocketSession = USER_SESSION_MAP.remove(sessionKey)!!
        try {
            session.close(CloseStatus.BAD_DATA)
        } catch (ignored: Exception) {
        }
    }

    /**
     * 根据会话键从用户会话Map中获取WebSocket会话
     *
     * @param sessionKey 要获取的会话键
     * @return 与给定会话键对应的WebSocket会话，如果不存在则返回null
     */
    @JvmStatic
    fun getSessions(sessionKey: Long): WebSocketSession? {
        return USER_SESSION_MAP[sessionKey]
    }

    /**
     * 获取存储在用户会话Map中所有WebSocket会话的会话键集合
     *
     * @return 所有WebSocket会话的会话键集合
     */
    @JvmStatic
    fun getSessionsAll(): MutableSet<Long> {
        return USER_SESSION_MAP.keys
    }

    /**
     * 检查给定的会话键是否存在于用户会话Map中
     *
     * @param sessionKey 要检查的会话键
     * @return 如果存在对应的会话键，则返回true；否则返回false
     */
    @JvmStatic
    fun existSession(sessionKey: Long): Boolean {
        return USER_SESSION_MAP.containsKey(sessionKey)
    }
}
